home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MOS / KEYBOARD.I < prev    next >
Encoding:
Modula Implementation  |  1990-11-10  |  10.8 KB  |  405 lines

  1. IMPLEMENTATION MODULE Keyboard;
  2. (*$Y+,C-,L-,N+*)
  3.  
  4. (*
  5.   TT 30.08.89  wdLeft/Right mit soln/eoln vertauscht
  6.   TT 26.05.90  GemCharToKey korrigiert: ctrl wird nun richtig (?) gesetzt
  7. *)
  8.  
  9. FROM SYSTEM IMPORT ASSEMBLER;
  10. FROM SYSTEM IMPORT BYTE, LONGWORD, WORD, ADDRESS;
  11.  
  12. FROM MOSGlobals IMPORT Key;
  13.  
  14.  
  15.  
  16. PROCEDURE GemCharToKey (gemChar: WORD; specialKeySet: BYTE; VAR k: Key);
  17.   BEGIN
  18.     ASSEMBLER
  19.         MOVE.L  -(A3),A0
  20.         SUBQ.L  #1,A3
  21.         MOVE.B  -(A3),D1        ; D1: ctrl
  22.         MOVEQ   #0,D0
  23.         MOVE.W  -(A3),D0        ; |   0|   0|scan|  ch|
  24.         ROR.L   #8,D0           ; |  ch|   0|   0|scan|
  25.         SWAP    D0              ; |   0|scan|  ch|   0|
  26.         MOVE.B  D1,D0           ; |   0|scan|  ch|ctrl|
  27.         LSR.B   #1,D0
  28.         BCC     n
  29.         BSET    #0,D0
  30.      n: ANDI.B  #1111%,D0
  31.         SWAP    D0
  32.         MOVE.L  D0,(A0)         ; |  ch|ctrl|   0|scan|
  33.     END
  34.   END GemCharToKey;
  35.  
  36. PROCEDURE KeyToGemChar (k: Key; VAR gemChar: WORD; VAR specialKeySet: BYTE);
  37.   BEGIN
  38.     ASSEMBLER
  39.         MOVE.L  -(A3),A1
  40.         MOVE.L  -(A3),A0
  41.         MOVE.L  -(A3),D0        ; |  ch|ctrl|   0|scan|
  42.         SWAP    D0              ; |   0|scan|  ch|ctrl|
  43.         LSL.B   #1,D0
  44.         MOVE.B  D0,(A1)
  45.         LSR.L   #8,D0           ; |   0|   0|scan|  ch|
  46.         MOVE.W  D0,(A0)
  47.     END
  48.   END KeyToGemChar;
  49.  
  50. PROCEDURE LongToKey (l: LONGWORD; VAR k: Key);
  51.   BEGIN
  52.     ASSEMBLER
  53.         MOVE.L  -(A3),A0
  54.         MOVE.L  -(A3),D0        ; |ctrl|scan|   0|  ch|
  55.         ROR.L   #8,D0
  56.         SWAP    D0
  57.         LSR.B   #1,D0
  58.         BCC     n
  59.         BSET    #0,D0
  60.      n: ANDI.B  #1111%,D0
  61.         SWAP    D0
  62.         LSR.W   #8,D0
  63.         MOVE.L  D0,(A0)         ; |  ch|ctrl|   0|scan|
  64.     END
  65.   END LongToKey;
  66.  
  67. PROCEDURE KeyToLong (k: Key; VAR l: LONGWORD);
  68.   BEGIN
  69.     ASSEMBLER
  70.         MOVE.L  -(A3),A0
  71.         MOVE.L  -(A3),D0        ; |  ch|ctrl|   0|scan|
  72.         LSL.W   #8,D0           ; |  ch|ctrl|scan|   0|
  73.         SWAP    D0
  74.         LSL.B   #1,D0
  75.         SWAP    D0
  76.         ROL.L   #8,D0
  77.         MOVE.L  D0,(A0)         ; |ctrl|scan|   0|  ch|
  78.     END
  79.   END KeyToLong;
  80.  
  81.  
  82. VAR keyTable: ADDRESS;
  83.  
  84. TABLE.B
  85.  
  86.   CapTbl: (* Alphablock *)
  87.           0,escCap,0,0,0,0,0,0,0,0,0,0,0,0,backspaceCap,
  88.           tabCap,0,0,0,0,0,0,0,0,0,0,0,0,returnCap,
  89.           0,0,0,0,0,0,0,0,0,0,0,0,0,  (* Control..'~' *)
  90.           0,0,0,0,0,0,0,0,0,0,0,0,0,  (* Shift..Shift *)
  91.           0, (* print screen *)
  92.           0,0,0, (* Alternate; Space; Caps *)
  93.           f1Cap,f2Cap,f3Cap,f4Cap,f5Cap,f6Cap,f7Cap,f8Cap,f9Cap,f10Cap,
  94.           0,0,clrHomeCap,upCap,0,0,leftCap,0,rightCap,0,0,downCap,
  95.           0,insertCap,deleteCap,
  96.           f1Cap,f2Cap,f3Cap,f4Cap,f5Cap,f6Cap,f7Cap,f8Cap,f9Cap,f10Cap,
  97.           0,0,0,undoCap,helpCap,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  98.           enterCap,leftCap,rightCap,0,0,clrHomeCap;
  99.  
  100. PROCEDURE KeyCap (VAR k: Key): Cap;
  101.   BEGIN
  102.     ASSEMBLER
  103.         CLR     D1
  104.         MOVE.L  -(A3),A0
  105.         MOVE.W  Key.scan(A0),D0
  106.         CMPI    #$77,D0
  107.         BHI     unspec
  108.         LEA     CapTbl,A0
  109.         MOVE.B  0(A0,D0.W),D1
  110. unspec  MOVE    D1,(A3)+
  111.     END
  112.   END KeyCap;
  113.  
  114. TABLE.B
  115.  
  116.   KeyTbl: (* Alphablock *)
  117.           0,esc,0,0,0,0,0,0,0,0,0,0,0,0,backspace,
  118.           tab,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,return,
  119.           0,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,0,0,  (* Control..'~' *)
  120.           0,0,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,  (* Shift..Shift *)
  121.           0, (* print screen *)
  122.           0,0,0, (* Alternate; Space; Caps *)
  123.           f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,
  124.           0,0,-1(*home*),-1(*up*),pgUp,0,-1(*left*),0,-1(*right*),
  125.           0,0,-1(*down*),
  126.           pgDown,-1,-1,
  127.           f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,
  128.           0,0,0,undo,help,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  129.           enter,wdLeft,wdRight,0,pgDown,home,
  130.           alt1, alt2, alt3, alt4, alt5, alt6, alt7, alt8, alt9, alt0,
  131.           0,0,pgUp;
  132.  
  133.   CrsrTbl: home, clr, up, pgUp, left, soln, right, eoln, down, pgDown,
  134.            insert, insLine, delete, delLine;
  135.  
  136. PROCEDURE SpecialKey (VAR k: Key): SpecialCode;
  137.   BEGIN
  138.     ASSEMBLER
  139.         CLR     D1
  140.         MOVE.L  -(A3),A0
  141.         MOVE.W  Key.scan(A0),D0
  142.         MOVE.B  Key.ch(A0),D2
  143.         CMPI    #$84,D0
  144.         BHI     ok
  145.         LEA     KeyTbl,A1
  146.         MOVE.B  0(A1,D0.W),D1
  147.         BPL     ok
  148.         CLR     D1
  149.         ; Sonderbehandlung
  150.         LEA     CrsrTbl,A1
  151.         CMPI    #$47,D0         ; home ?
  152.         BEQ     x
  153.         ADDQ.L  #2,A1
  154.         CMPI    #$48,D0         ; up ?
  155.         BEQ     x
  156.         ADDQ.L  #2,A1
  157.         CMPI    #$4B,D0         ; left ?
  158.         BEQ     x
  159.         ADDQ.L  #2,A1
  160.         CMPI    #$4D,D0         ; right ?
  161.         BEQ     x
  162.         ADDQ.L  #2,A1
  163.         CMPI    #$50,D0         ; down ?
  164.         BEQ     x
  165.         ADDQ.L  #2,A1
  166.         CMPI    #$52,D0         ; insert ?
  167.         BEQ     x
  168.         ADDQ.L  #2,A1
  169.         CMPI    #$53,D0         ; delete ?
  170.         BEQ     y
  171.         ; Es ist ein Buchstabe
  172.         TST.B   D2              ; Alternate-Kombination ?
  173.         BEQ     altCh
  174.         CMPI.B  #' ',D2         ; Ist es ein Ctrl-Zeichen ?
  175.         BCC     ok
  176.         MOVE.B  D2,D1
  177.         ADDI    #ctrlA-1,D1
  178.         BRA     ok
  179. y       CMPI.B  #$7F,D2
  180.         BRA     z
  181. x       TST.B   D2
  182. z       BNE     second
  183.         MOVE.B  (A1),D1
  184.         BRA     ok
  185. altCh   MOVE.L  keyTable,A1
  186.         MOVE.B  0(A1,D0.W),D1   ; Buchstabenwert holen (ungeshiftet)
  187.         ADDI    #altA-$61,D1
  188.         BRA     ok
  189. second  MOVE.B  1(A1),D1
  190. ok      MOVE    D1,(A3)+
  191.     END
  192.   END SpecialKey;
  193.  
  194. PROCEDURE IsSpecial (VAR k: Key): BOOLEAN;
  195.   BEGIN
  196.     ASSEMBLER
  197.         JSR     SpecialKey
  198.         TST     -(A3)
  199.         SNE     D0
  200.         ANDI    #1,D0
  201.         MOVE    D0,(A3)+
  202.     END
  203.   END IsSpecial;
  204.  
  205. PROCEDURE IsCharacter (VAR k: Key): BOOLEAN;
  206.   BEGIN
  207.     ASSEMBLER
  208.         ; true, wenn Ctrl-2 (NUL) oder ch # 0C und keine Cursortaste.
  209.         MOVE.L  -(A3),A0
  210.         MOVE    Key.scan(A0),D0
  211.         TST.B   Key.ch(A0)
  212.         BNE     ch
  213.         CMPI    #3,D0   ; Ctrl-2
  214.         BEQ     yes
  215.         CMPI    #$6E,D0 ; Ctrl-2 auf Ziffernblock
  216.         BEQ     yes
  217.         CMPI    #$39,D0 ; Ctrl-SPACE
  218.         BEQ     yes
  219. no:     CLR     (A3)+
  220.         RTS
  221. ch:     CMPI    #$4A,D0 ; + auf Ziffernblock
  222.         BEQ     yes
  223.         CMPI    #$4E,D0 ; - auf Ziffernblock
  224.         BEQ     yes
  225.         CMPI    #$53,D0 ; Delete
  226.         BEQ     yes
  227.         CMPI    #$45,D0
  228.         BCS     yes
  229.         CMPI    #$54,D0
  230.         BCS     no
  231. yes:    MOVE    #1,(A3)+
  232.     END
  233.   END IsCharacter;
  234.  
  235. PROCEDURE IsASCII (VAR k: Key): BOOLEAN;
  236.   BEGIN
  237.     ASSEMBLER
  238.         JMP     IsCharacter
  239.     END
  240.   END IsASCII;
  241.  
  242. PROCEDURE IsCursor (VAR k: Key): BOOLEAN;
  243.   BEGIN
  244.     ASSEMBLER
  245.         MOVE.L  -(A3),A0
  246.         MOVE    Key.scan(A0),D0
  247.         CMPI    #$73,D0
  248.         BEQ     yes
  249.         CMPI    #$74,D0
  250.         BEQ     yes
  251.         CMPI    #$4D,D0
  252.         BEQ     yes
  253.         CMPI    #$4B,D0
  254.         BEQ     yes
  255.         CMPI    #$48,D0
  256.         BEQ     yes
  257.         CMPI    #$50,D0
  258.         BEQ     yes
  259.         CLR     (A3)+
  260.         RTS
  261. yes:    MOVE    #1,(A3)+
  262.     END
  263.   END IsCursor;
  264.  
  265. PROCEDURE IsAlternate (VAR k: Key): BOOLEAN;
  266.   BEGIN
  267.     ASSEMBLER
  268.         MOVE.L  -(A3),A0
  269.         TST.B   Key.ch(A0)
  270.         BNE     no
  271.         MOVE    Key.scan(A0),D0
  272.         ; Alt1-Alt0 ?
  273.         CMPI    #$82,D0
  274.         BCC     no
  275.         CMPI    #$78,D0
  276.         BCC     yes
  277.         ; Y-M ?
  278.         CMPI    #$32,D0
  279.         BCC     no
  280.         CMPI    #$2C,D0
  281.         BCC     yes
  282.         ; A-L ?
  283.         CMPI    #$27,D0
  284.         BCC     no
  285.         CMPI    #$1E,D0
  286.         BCC     yes
  287.         ; Q-P ?
  288.         CMPI    #$1A,D0
  289.         BCC     no
  290.         CMPI    #$10,D0
  291.         BCC     yes
  292. no:     CLR     (A3)+
  293.         RTS
  294. yes:    MOVE    #1,(A3)+
  295.     END
  296.   END IsAlternate;
  297.  
  298. PROCEDURE IsFunction (VAR k: Key): BOOLEAN;
  299.   BEGIN
  300.     ASSEMBLER
  301.         MOVE.L  -(A3),A0
  302.         MOVE    Key.scan(A0),D0
  303.         ; F11-F20 ?
  304.         CMPI    #$5E,D0
  305.         BCC     no
  306.         CMPI    #$54,D0
  307.         BCC     yes
  308.         ; F1-F10 ?
  309.         CMPI    #$45,D0
  310.         BCC     no
  311.         CMPI    #$3B,D0
  312.         BCC     yes
  313. no:     CLR     (A3)+
  314.         RTS
  315. yes:    MOVE    #1,(A3)+
  316.     END
  317.   END IsFunction;
  318.  
  319. PROCEDURE OnNumBlock (VAR k: Key): BOOLEAN;
  320.   BEGIN
  321.     ASSEMBLER
  322.         MOVE.L  -(A3),A0
  323.         MOVE    Key.scan(A0),D0
  324.         CMPI    #$4A,D0
  325.         BEQ     yes
  326.         CMPI    #$4E,D0
  327.         BEQ     yes
  328.         CMPI    #$72,D0
  329.         BHI     no
  330.         CMPI    #$63,D0
  331.         BCC     yes
  332. no:     CLR     (A3)+
  333.         RTS
  334. yes:    MOVE    #1,(A3)+
  335.     END
  336.   END OnNumBlock;
  337.  
  338. PROCEDURE OnAlphaBlock (VAR k: Key): BOOLEAN;
  339.   BEGIN
  340.     ASSEMBLER
  341.         MOVE.L  -(A3),A0
  342.         MOVE    Key.scan(A0),D0
  343.         BEQ     no
  344.         CMPI    #$53,D0         ; delete ?
  345.         BEQ     yes
  346.         CMPI    #$60,D0         ; < / >
  347.         BEQ     yes
  348.         CMPI    #$84,D0         ; alt-# +1
  349.         BCC     no
  350.         CMPI    #$78,D0         ; alt-1
  351.         BCC     yes
  352.         CMPI    #$3A,D0
  353.         BLS     yes
  354. no:     CLR     (A3)+
  355.         RTS
  356. yes:    MOVE    #1,(A3)+
  357.     END
  358.   END OnAlphaBlock;
  359.  
  360. PROCEDURE OnCursorBlock (VAR k: Key): BOOLEAN;
  361.   BEGIN
  362.     ASSEMBLER
  363.         JSR     IsCursor
  364.         TST     -2(A3)
  365.         BNE     ok
  366.         CMPI    #$47,D0         ; home
  367.         BEQ     yes
  368.         CMPI    #$77,D0         ; ctrl-home
  369.         BEQ     yes
  370.         CMPI    #$52,D0         ; insert
  371.         BEQ     yes
  372.         CMPI    #$61,D0         ; help
  373.         BEQ     yes
  374.         CMPI    #$62,D0         ; undo
  375.         BNE     ok
  376. yes     MOVE    #1,-2(A3)
  377. ok
  378.     END
  379.   END OnCursorBlock;
  380.  
  381. PROCEDURE OnFunctionBlock (VAR k: Key): BOOLEAN;
  382.   BEGIN
  383.     ASSEMBLER
  384.         JMP     IsFunction
  385.     END
  386.   END OnFunctionBlock;
  387.  
  388.  
  389. BEGIN
  390.   ASSEMBLER
  391.         ; Key-Tabelle ermitteln
  392.         MOVEQ   #-1,D0
  393.         MOVE.L  D0,-(A7)
  394.         MOVE.L  D0,-(A7)
  395.         MOVE.L  D0,-(A7)
  396.         MOVE    #16,-(A7)
  397.         TRAP    #14
  398.         ADDA.W  #14,A7
  399.         MOVE.L  D0,A0
  400.         MOVE.L  (A0),keyTable
  401.   END
  402. END Keyboard.
  403. ə
  404. (* $FFF6B877$FFF6B877$FFF6B877$FFF6B877$FFF6B877$FFF6B877$FFF6B877$FFF6B877$FFF6B877$FFF6B877$FFF6B877$FFF6B877$FFF6B877$FFF6B877$FFF6B877$00000158$FFF6B877$FFF6B877$FFF6B877$FFF6B877$FFF6B877$FFF6B877$FFF6B877$FFF6B877$FFF6B877$FFF6B877$FFF6B877$FFF6B877$FFF6B877$FFF6B877$FFF6B877$FFF6B877$FFF6B877$FFF6B877$FFF6B877$FFF6B877$FFF6B877$FFF6B877$FFF6B877$FFF6B877$FFF6B877$FFF6B877Ç$000001F4T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$FFEE2C3C$FFEE2C3C$0000002A$000007FB$00000826$00000622$00000108$00000026$000000DF$00000306$00000071$0000007C$000000B8$000001F4$000002CD$00000306îÇÇ*)
  405.